`timescale 1ns/1ns
`define clk_period 20

module uart_byte_rx_tb;

reg clk;
reg rst_n;
reg uart_rx;
reg [1:0] bps_setting;
reg [1:0] check_setting;

wire [7:0]data;
wire rx_done;

uart_byte_rx uart_byte_rx_instance0(
		.clk(clk),			   // 时钟发生器：system 50MHz
		.rst_n(rst_n), 			// 复位使能：reg
		.uart_rx(uart_rx),		   // 串口接受线: system
		.bps_setting(bps_setting), 	// 波特率：reg 
		.check_setting(check_setting), // 校验方式: reg
		
		.data(data),			   // 数据: reg
		.rx_done(rx_done)   		// 一次发送数据完成标志
	);


	initial clk = 1'b0;
	always #(`clk_period/2) 
		clk = ~clk;
	
	initial begin
		rst_n = 1'b1;
		uart_rx = 1'b1;
		bps_setting = 2'b00;
		check_setting = 2'b00;
		#(`clk_period*2);
		rst_n = 1'b0;
		#(`clk_period*2);
		rst_n = 1'b1;
		// 开始发送数据 8'b10101010
		uart_rx = 1'b0; // 开始位下降沿，配置读取成功
		#(`clk_period*434);
		uart_rx = 1'b0; // 最低位0
		#(`clk_period*434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; // 最高位1
		#(`clk_period * 434);
		
		// 没有校验位
		// 1位停止位
		uart_rx = 1'b1;
		#(`clk_period * 434);
		
		// 这里应该输出 rx_done
		#(`clk_period * 434);
		
		
		// 加入校验位仿真
		rst_n = 1'b1;
		uart_rx = 1'b1;
		bps_setting = 2'b00;
		check_setting = 2'b11;
		#(`clk_period * 2);
		rst_n = 1'b0;
		#(`clk_period * 2);
		rst_n = 1'b1;
		// 开始发送数据 8'b10101010
		uart_rx = 1'b0; // 开始位下降沿，配置读取成功
		#(`clk_period * 434);
		uart_rx = 1'b0; // 最低位0
		#(`clk_period * 434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; 
		#(`clk_period * 434);
		uart_rx = 1'b0; 
		#(`clk_period * 434);
		uart_rx = 1'b1; // 最高位1
		#(`clk_period * 434);
		
		// 校验位为1	
		uart_rx = 1'b1; // 校验位
		#(`clk_period * 434);
		
		// 1位停止位
		uart_rx = 1'b1;
		#(`clk_period * 434);
		
		// 这里应该输出 rx_done
		#(`clk_period * 434); 
		$stop;
	end 
	
endmodule
